package 注解.注解的解析;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) throws Exception {
        // 什么是注解的解析:
        // 就是判断类上, 方法上, 成员变量上是否存在注解, 并把注解里的内容给解析出来

        // 如何解析注释:
        // 指导思想: 要解析谁上的注解, 就应该先拿到谁
        // 比如要解析类上面的注解, 则应该先获取该类的Class对象, 再通过Class对象解析其上面的注解
        // 比如要解析成员方法上的注解, 则应该获取到该成员方法的Method对象, 再通过Method对象解析其上面的注解
        // Class、Method、Field, Constructor、都实现了AnnotatedElement接口, 他们都拥有解析注释的能力

        // AnnotatedElement接口提供了解析注解的方法:
        // 1. public Annotation[] getDeclaredAnnotations(): 获取当前对象上面的注解
        // 2. public T getDeclaredAnnotation(Class<T> annotationClass): 获取指定的注解对象
        // 3. public boolean isAnnotationPresent(Class<Annotation> annotationClass): 判断当前对象上是否存在某个注解

        // 解析注解的案例, 具体需求如下:
        // 1. 定义注解MyTest4, 要求如:
        //        包含属性: String value()
        //        包含属性: double aaa(), 默认值为 100
        //        包含属性: String[] bbb()
        //        限制注解使用的位置: 类和成员方法上
        //        指定注解的有效范围: 一直到运行时
        // 2. 定义一个类叫: Demo, 在类中定义一个Test1方法, 并在该类和其方法上使用MyTest4注解
        // 3. 在该类测试, 解析Demo类中的全部注解

        // 测试: 类上
        // 1. 先得到Class类
        Class c = Demo.class;
        // 2. 解析类上的注解
        //    判断类上是否包含某个注解
        if (c.isAnnotationPresent(MyTest4.class)) {
            MyTest4 myTest4 = (MyTest4) c.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            System.out.println(Arrays.toString(myTest4.bbb()));
        }

        // 测试: 方法上
        // 1. 先得到Class类后,再得到Method类
        Class c1 = Demo.class;
        Method m = c.getDeclaredMethod("test1");
        // 2. 解析类上的注解
        //    判断方法对象上是否包含某个注解
        if (m.isAnnotationPresent(MyTest4.class)) {
            MyTest4 myTest4 = (MyTest4) m.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            System.out.println(Arrays.toString(myTest4.bbb()));
        }
    }
}
